package com.zkh.myframe.server.tomcat.websocket;

import java.util.List;

/**
 * WebSocket会话工具类，支持扩展外部会话池
 * @author zkh
 */
public class WebSocketSessionUtils {
	//会话池
	private static SessionPool sessionPools = new WebSocketDefaultSessionPools();
	
	/**
	 * 设置自定义会话池，来替换系统默认的会话池（一般在启动应用时统一设置，使用期间不建议切换会话池）
	 * @param pool 自定义会话池对象
	 */
	public synchronized static void setSessionPool(SessionPool pool) {
		if(pool==null) {
			throw new NullPointerException();
		}
		sessionPools = pool;
	}
	
	/**
	 * 获取指定分支连接数
	 * @param branchId 分支编号
	 * @return
	 */
	public static int getOnlineCount(String branchId) {
		return sessionPools.getOnlineCount(branchId);
	}
	
	/**
	 * 指定分支连接数加1
	 * @param branchId 分支编号
	 */
	static int addOnlineCount(String branchId) {
		return sessionPools.addOnlineCount(branchId);
	}
	
	/**
	 * 指定分支连接数减1
	 * @param branchId 分支编号
	 */
	static int subtractOnlineCount(String branchId) {
		return sessionPools.subtractOnlineCount(branchId);
	}
	
	/**
	 * 保存WebSocket连接
	 * @param branchId 分支编号
	 * @param userKey 用户标识
	 * @param webSocketCore WebSocket连接
	 */
	static void saveSocket(String branchId, String userKey, WebSocketCore webSocketCore) {
		sessionPools.saveSocket(branchId, userKey, webSocketCore);
	}
	
	/**
	 * 移除WebSocket连接
	 * @param branchId 分支编号
	 * @param userKey 用户标识
	 * @param webSocketCore WebSocket连接
	 */
	static void removeSocket(String branchId, String userKey, WebSocketCore webSocketCore) {
		sessionPools.removeSocket(branchId, userKey, webSocketCore);
	}
	
	/**
	 * 获取一个WebSocket连接。如果返回对象为null，说明用户不在线
	 * @param branchId 分支编号
	 * @param userKey 用户标识
	 */
	public static WebSocketCore getWebSocketSession(String branchId, String userKey) {
		return sessionPools.getWebSocketSession(branchId, userKey);
	}
	
	/**
	 * 获取多个WebSocket连接。如果返回列表的项为null，说明用户不在线
	 * @param branchId 分支编号
	 * @param userKeyList 用户标识列表
	 * @param offlineUserList 离线用户列表。如果不需要获取离线用户，直接传null即可
	 */
	public static List<WebSocketCore> getWebSocketSessions(String branchId, List<String> userKeyList, List<String> offlineUserList){
		return sessionPools.getWebSocketSessions(branchId, userKeyList, offlineUserList);
	}
}
